Sistema de Nombrado en Java (JNDI) [Parte I]

Un nombre compuesto es un nombre de un s�lo sistema de nombres. Aqu� tenemos un ejemplo de un nombre compuesto.

cn=homedir,cn=Jon Ruiz,ou=People

Esta es la representaci�n string del nombre LDAP que contiene tres componentes.

ou=People
cn=Jon Ruiz
cn=homedir

.�Relaci�n entre Nombre Compuesto y Nombre Mixto

Cuando pasamos un nombre string a un m�todo de Context, como lookup(), el m�todo espera un nombre mixto. El nombre mixto podr�a tener s�lo un componente. Podr�amos pasarle un nombre string LDAP, por ejemplo a lookup().

La �nica restricci�n es tener en cuenta si el nombre string contiene caracteres que tienen conflictos con la s�ntaxis de nombre mixto. En ese caso, esos caracteres necesitan ser escapados o entrecomillados. Por ejemplo, el nombre compuesto cn=a/b necesita especificarse como cn=a\/b para evitar que sea interpretado como un nombre mixto que tiene dos componentes.

Cuando pasamos un argumento Name a un m�todo de Context, como lookup(), el m�todo puede aceptar un nombre mixto o un nombre compuesto, como se explic� en la p�gina anterior. Para hacer que el argumento sea interpretado como un nombre mixto, debemos usar un ejemplar de CompositeName.

.�Representaciones String

Como se vi� en el ejemplo anterior, un nombre compuesto consiste en componentes.

Los componentes est�n separados de acuerdo a la s�ntaxis del sistema de nombres. Por ejemplo, en LDAP, los componentes est�n ordenados de derecha a izquierda y separados por una coma (","). As�, la representaci�n string de los siguientes componentes.

ou=People
cn=Jon Ruiz
cn=homedir

es:

cn=homedir,cn=Jon Ruiz,ou=People

.�La Clase CompoundName

La clase CompoundName es una clase de conveniencia para representar la forma estuctural de un nombre compuesto. Su constructor acepta una representaci�n string del nombre compuesto y un conjunto de propiedades que describen la s�ntaxis de nombrado del nombre. El conjunto de propiedades y la clase CompoundName se han creado lo suficientemente flexibles para casi todos los sistemas de nombres. Sin embargo, los implementadores podr�an elegir su propias implementaciones de nombres compuestos que sean subclases de CompoundName o cualquier otra clase que implemente el interface Name.

Normalmente, usaremos el constructor de CompoundName s�lo si est�mos escribiendo un proveedor de servicios. Como desarrollador de aplicaciones, normalmente encontraremos nombres compuestos (CompoundName o implementaciones directas de Name) cuando queramos analizar un nombre de un sistema de nombres particular.

Aqu� tenemos un ejemplo que obtiene el analizador de nombres para un contexto en el sistema de nombres y usa el analizador para descomponer un nombre de ese sistema de nombres.

NameParser parser = ctx.getNameParser("");
Name compoundName = parser.parse(compoundStringName);

.�Manipular un Nombre Compuesto

Observa que NameParser.parse() devuelve un objeto que implementa el interface Name. Este interface tambi�n est� implementado por las clases CompositeName y CompoundName.

Esto significa que podemos acceder y actualizar los componentes de un nombre compuesto de la misma forma en que lo hac�amos con los nombres mixtos.

El siguiente ejemplo reemplaza el segundo componente de un nombre compuesto y a�ade componentes al principio y al final del nombre.

// Get the parser for this namespace
NameParser parser = ctx.getNameParser("");

// Parse the name
Name cn = parser.parse("cn=John,ou=People,ou=Marketing");

// Remove the second component from the head
System.out.println(cn.remove(1));          // ou=People

// Add to the head (first)
System.out.println(cn.add(0, "ou=East"));  // cn=John,ou=Marketing,ou=East

// Add to the tail (last)
System.out.println(cn.add("cn=HomeDir"));  // cn=HomeDir,cn=John,ou=Marketing,ou=East

Al ejecutar este programa se produce la siguiente salida.

ou=People
cn=John,ou=Marketing,ou=East
cn=HomeDir,cn=John,ou=Marketing,ou=East

Observa que las nociones de principio y final son independientes de la s�ntaxis de nombres. Por ejemplo, la s�ntaxis LDAP especifica que los componentes se ordenan de derecha a izquierda. Esto significa que el componente m�s a la derecha es el principio y el componente m�s a la izquierda el final del nombre.

Para dicho nombre, un componente a�dido al principio ("cn=East") se a�ade a la derecha y un componente a�adido al final ("cn=HomeDir") se a�ade a la izquierda.

Abajo tenemos la salida producida por una versi�n modificada del ejemplo anterior. Este ejemplo usa la s�ntaxis de nombres de ficheros UNIX en vez de la s�ntaxis LDAP.

People
East/Marketing/John
East/Marketing/John/HomeDir

.�Nombres Compuestos como Argumentos a los M�todos de Context

Un ejemplar de Name no es un CompositeName pasado a los m�todos de los interfaces Context y DirContext es tratado como un nombre compuesto. Abajo tenemos un ejemplo que localiza una entrada LDAP usando un nombre compuesto. Primero obtiene un contexto dentro del espacio de nombres LDAP. Luego obtiene un analizador para ese espacio de nombres llamando a Context.getNameParser(), que luego es usado para descomponer el nombre string LDAP en un nombre compuesto. Ese nombre compuesto se usa en la llamada a lookup():�

// Create the initial context
Context ctx = new InitialContext(env);

// Get the parser for the namespace
NameParser parser = ctx.getNameParser("");

// Parse the string name into a compound name
Name compound = parser.parse("cn=Jon Ruiz,ou=people");

// Perform the lookup using the compound name
Object obj = ctx.lookup(compound);

.�Nombres Compuestos Totalmente Cualificados

Algunas veces queremos obtener un nombre totalmente cualificado de un objeto.

Por ejemplo, en el DNS, podr�amos querer conocer el nombre totalmente cualificado de una m�quina en Internet para que pueda ser usado en autentificaci�n o como una direcci�n para un servicio de entrega de correo. En el LDAP, un nombre distinguido totalmente cualificado podr�a insertarse dentro de un certificado X.509 o darse como una direcci�n e-mail o como parte de una URL.

El uso de este nombre totalmente cualificado normalmetne est� fuera del �mbito de JNDI. Es decir, una vez que se obtiene el nombre, es pasado y utilizado en otros subsistemas en vez de volver a entrar en los APIs de JNDI.

Adem�s, la definici�n de totalmente cualificado est� determinada por el proveedor de servicios y/o por el sistema de nombres/directorio subyancente.

El JNDI proporciona Context.getNameInNamespace() para obtener un nombre totalmente cualificado de un objeto, en relaci�n a su propio espacio de nombres. Es decir, el resultado es un nombre en el espacio de nombres servido por el sistema de nombres subyacente.

Aqu� tenemos un ejemplo que localiza una entrada ("cn=Jon Ruiz, ou=people") y que invoca a getNameInNamespace() para obtener un nombre LDAP totalmente cualificado.

// Create the initial context
Context ctx = new InitialContext(env);

// Perform the lookup 
Context jon = (Context)ctx.lookup("cn=Jon Ruiz,ou=people");

String fullname = jon.getNameInNamespace();

Cuando se ejecuta este programa, se obtiene la siguiente salida.

cn=Jon Ruiz,ou=people,o=JNDItutorial

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO